﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DAL.DTOs;
using DAL.Modelos;
using DAL;
using CuadroMandoIntegralFMCH.Ds;

namespace CuadroMandoIntegralFMCH.Form_s.Debitos
{
    public partial class DebitosProcesarTotales : Form
    {
        public DebitosProcesarTotales()
        {
            InitializeComponent();
        }

        private void btImportar_Click(object sender, EventArgs e)
        {
            if (Validar())
            {
                var mes = dateTimePicker1.Value.Month;
                var anio = dateTimePicker1.Value.Year;

                var verificacion = new Modelo().VerificarPeriodoDebito(mes, anio);

                if (verificacion)
                {

                    var idPeriodo = new Modelo().VerificacionPeriodoId(mes, anio);
                    backgroundWorker.RunWorkerAsync(idPeriodo);

                    var importe = decimal.Parse(tbTotalFactura.Text);
                    var totalPeriodo = new TotalPorPeriodo()
                                           {
                                               TotalPeriodo = importe,
                                               idPeriodo = idPeriodo
                                           };
                    var mensage = new Modelo().AddTotalFacturadoPorPeriodo(totalPeriodo);
                    if (!mensage.status)
                        MessageBox.Show(mensage.message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

                }
                else
                {
                    MessageBox.Show("El período solicitado no existe", "Advertencia", MessageBoxButtons.OK,
                                    MessageBoxIcon.Exclamation);
                }
            }
        }

        private bool Validar()
        {
            if(tbTotalFactura.Text == "")
            {
                errorProvider1.SetError(tbTotalFactura,"Ingrese el monto total de la Factura");
                return false;
            }
            else
            {
                return true;
            }
        }

        private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            var idPeriodo = e.Argument is int ? (int) e.Argument : 0;

            var debitos = new Modelo().DebitosPeriodo(idPeriodo);

            progressBar1.Minimum = 0;
            progressBar1.Maximum = debitos.Count;
            var codFacturación = 0;
            var denominacion = "";
            decimal importe = 0;
            var i = 0;
            if (!new Modelo().VerificacionTotales(idPeriodo))
            {
                foreach (var debito in debitos)
                {

                    if (codFacturación != debito.CodFacturacion && i == 0)
                    {

                        codFacturación = (int) debito.CodFacturacion;
                        var prestador = new Modelo().ConsultarPrestador(codFacturación);
                        var persona = new Modelo().ConsultarPersona((decimal) prestador.Documento);

                        denominacion = persona.Apellido + " " + persona.Nombres;

                        importe = importe +
                                  ((debito.HonAcordado - debito.Honorarios) + (debito.GtoAcordado - debito.Gastos));

                    }
                    else if (codFacturación == debito.CodFacturacion)
                    {
                        importe = importe +
                                  ((debito.HonAcordado - debito.Honorarios) + (debito.GtoAcordado - debito.Gastos));
                    }
                    else if (codFacturación != debito.CodFacturacion && i != 0)
                    {
                        var total = new Totale()
                                        {
                                            Importe = importe,
                                            CodFacturacion = codFacturación,
                                            IdPeriodo = idPeriodo
                                        };
                        var mensage = new Modelo().AddTotales(total);

                        if (!mensage.status)
                            MessageBox.Show(mensage.message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

                        importe = 0;

                        codFacturación = (int) debito.CodFacturacion;
                        var prestador = new Modelo().ConsultarPrestador(codFacturación);
                        var persona = new Modelo().ConsultarPersona((decimal) prestador.Documento);

                        denominacion = persona.Apellido + " " + persona.Nombres;

                        importe = importe +
                                  ((debito.HonAcordado - debito.Honorarios) + (debito.GtoAcordado - debito.Gastos));
                    }

                    backgroundWorker.ReportProgress(i);
                    i++;
                }
              
            }
            else
            {
                backgroundWorker.CancelAsync();
                e.Cancel = true;
            }
        }

        private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Visible = true;
            progressBar1.Value = e.ProgressPercentage;
        }

        private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            progressBar1.Visible = false;

            if (e.Error != null)
            {
                MessageBox.Show(@"Error: " + e.Error.Message, @"Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else if(e.Cancelled)
            {
                MessageBox.Show("Ya existe esta totalización, por favor pongase en contacto con el administrador",
                                "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            else
            {
                MessageBox.Show(@"Finalizo el proceso", @"Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
    }
}
